#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include "task.h"

#define N 3
typedef void(*func_t)();
func_t tasks[N]={NULL};

void download_task_Init()
{
    tasks[0]=PrintLog;
    tasks[1]=Download;
    tasks[2]=MysqlDataSync;
}
//father
void downloadtask()
{
    download_task_Init();
}
void Do_Other_thing()
{
    for(int i=0;i<N;i++)
    {
        tasks[i]();
    }
}

//child
void child_task()
{
     int cnt =5;
     while(cnt)
     {
         printf("i am a child procrss, pid:%d, ppid:%d\n",getpid(),getppid());
         sleep(1);
         cnt--;
     }
     printf("子进程运行结束，退出\n");
     exit(111);
}

int main()
{
   pid_t id=fork();
   if(id==0)
   {
      child_task();
   }
   downloadtask();
   //father
   while(1)
   {
       int status=0;
       pid_t rid =waitpid(id,&status,WNOHANG);
       if(rid==0)
       {
         usleep(10000);
         printf("检测成功，但是子进程未退出，进行下一次检测\n");
         Do_Other_thing();
       }
       else if(rid>0)
       {
           if(WIFEXITED(status))
           {
               printf("父进程回收成功，子进程退出码：%d\n",WIFEXITED(status));
           }
           else{
               printf("子进程退出异常\n");
           }
               break;
       }
       else{
          printf("父进程等待失败\n");
          break;
       }
   }

}

//int main()
//{
//    printf("I am father, pid: %d\n", getpid());
//    printf("父进程休眠\n");
//    pid_t id=fork();
//    if(id==0)//child
//    {
//        int cnt =3;
//        while(cnt)
//        {
//          printf("I am child process, pid: %d, ppid:%d, cnt: %d\n", getpid(), getppid(), cnt);
//          cnt--;  
//        }
//        printf("子进程退出\n");                 
//        exit(1);
//    }
//    // father
//    sleep(5);
//    int status=0;
//    printf("父进程准备回收子进程\n");
//    pid_t rid=waitpid(id,&status,0);
//    if(rid>0) printf("回收子进程成功,僵尸进程:%d\n",rid);
//    sleep(2);
//    printf("father quit, status: %d, child quit code : %d, child quit signal: %d\n", status, (status>>8)&0xFF, status & 0x7F);
//    return 0; 
//}
//









//int main()
//{
//    printf("hello world");
//    sleep(1);
//   _exit(123);
//
//
//   // while(1)
//   // {
//   //     printf("i am a process pid:%d\n",getpid());
//   //     sleep(2);
//   // }
//   // int *p=NULL;
//   // *p=100;
//   // return 0;
//}




//enum{
//  Sucess=0,
//  div_zero,
//  Mod_zero,
//};
//
//int exit_code=Sucess;
//
//int Div(int a,int b)
//{
//    if(b==0)
//    {
//      exit_code=div_zero;
//    }
//    else return a/b;
//}
//
//const char* code_to_str(int code)
//{
//    switch(code)
//    {
//        case Sucess:
//            return "Sucess";
//        case div_zero:
//            return "div_zero";
//        case Mod_zero:
//            return "Mod_zero";
//        default:
//            return "unknow";
//    }
//}
//
//int main()
//{
//    //自定义退出码
//    int res=Div(10,100);
//    printf("result:%d reason:[%s]\n",res,code_to_str(exit_code));
//    res=Div(2,0);
//    printf("result:%d reason:[%s]\n",res,code_to_str(exit_code));
//    return exit_code;
//
//    //打印默认退出码
//   // for(int errorcode=0;errorcode<255;errorcode++)
//   // {
   //     printf("errrcode[%d]:%s\n",errorcode,strerror(errorcode));
   // }
   // return 0;
    
   // printf("i am a process, pid:%d, ppid:%d\n",getpid(),getppid());
   // sleep(2);
   // return 3;
//}
